home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / CW GUSI 1.6.4 / Examples / GUSIPPCTest.c < prev    next >
C/C++ Source or Header  |  1995-01-26  |  4KB  |  192 lines

  1. /*********************************************************************
  2. File        :    GUSI                -    Grand Unified Socket Interface
  3. File        :    GUSIPPCTest        -    Test PPC sockets
  4. Author    :    Matthias Neeracher <neeri@iis.ethz.ch>
  5. Language    :    MPW C
  6.  
  7. $Log: GUSIPPCTest.c,v $
  8. Revision 1.2  1994/12/31  01:05:05  neeri
  9. ANSIfy (omitting parameter names was illegal).
  10.  
  11. Revision 1.1  1994/02/25  02:47:36  neeri
  12. Initial revision
  13.  
  14. Revision 0.3  1993/06/20  00:00:00  neeri
  15. New sa_constr
  16.  
  17. Revision 0.2  1992/10/14  00:00:00  neeri
  18. Fix NBP type, usage messages
  19.  
  20. Revision 0.1  1992/09/08  00:00:00  neeri
  21. Factor out common socket routines
  22.  
  23. *********************************************************************/
  24.  
  25. #include <GUSI.h>
  26. #include "GUSITest.h"
  27. #include <stdio.h>
  28. #include <fcntl.h>
  29. #include <stdlib.h>
  30. #include <errno.h>
  31. #include <string.h>
  32.  
  33. #include <Events.h>
  34. #include <TextUtils.h>
  35. #include <PLStringFuncs.h>
  36.  
  37. extern int GUSIDefaultSpin(spin_msg, long);
  38.  
  39. sa_constr_ppc    Constr    =    {
  40.     PPC_CON_NEWSTYLE+PPC_CON_MATCH_TYPE,
  41.     "\p",
  42.     {
  43.         smRoman,
  44.         "\p",
  45.         ppcByString,
  46.         "\pGUSIPPCTest"
  47.     }
  48. };
  49.  
  50. void Socket(char ch1, char ch2, const char * line)
  51. {
  52.     sock    =    socket(AF_PPC, SOCK_STREAM, 0);
  53.     
  54.     if (sock == -1)    {
  55.         printf("# socket() returned error %s\n", Explain());
  56.         Where();
  57.     }
  58. }
  59.  
  60. void Bind(char ch1, char ch2, const char * cmd)
  61. {
  62.     struct sockaddr_ppc    addr;
  63.  
  64.     if (sock == -1)    {
  65.         printf("# socket is not open\n");
  66.         Where();
  67.         
  68.         return;
  69.     }
  70.  
  71.     addr.family    =    AF_PPC;
  72.     addr.port.nameScript                        =    smRoman;
  73.     addr.port.portKindSelector                =    ppcByString;
  74.     addr.location.locationKindSelector    =    ppcNBPTypeLocation;
  75.     
  76.     if (sscanf(cmd, "%s %s", ((char *)addr.port.name)+1, ((char *)&addr.location.u.nbpType)+1) != 2) {
  77.         Usage(ch1, ch2);
  78.             
  79.         return;
  80.     }
  81.     
  82.     addr.port.name[0]             = strlen(((char *)addr.port.name)+1);
  83.     addr.location.u.nbpType[0] = strlen(((char *)&addr.location.u.nbpType)+1);
  84.     
  85.     PLstrcpy((StringPtr) &addr.port.u.portTypeStr, "\pGUSIPPCTest");
  86.  
  87.     if (bind(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc)))    {
  88.         printf("bind() returned error %s\n", Explain());
  89.         Where();
  90.     }
  91. }
  92.  
  93. void Accept(char ch1, char ch2, const char * line)
  94. {
  95.     int                        len;
  96.     struct sockaddr_ppc    addr;
  97.  
  98.     if (sock == -1)    {
  99.         printf("# socket is not open\n");
  100.         Where();
  101.         
  102.         return;
  103.     }
  104.     if (accsock != -1)    {
  105.         printf("# can't accept more than one connection\n");
  106.         Where();
  107.         
  108.         return;
  109.     }
  110.  
  111.     len    =    sizeof(struct sockaddr_ppc);
  112.     sock    =    accept(accsock = sock, (struct sockaddr *) &addr, &len);
  113.     
  114.     if (sock < 0)    {
  115.         printf("# accept() returned error %s\n", Explain());
  116.         sock        =    accsock;
  117.         accsock    =    -1;
  118.     } else {
  119.         addr.port.name[addr.port.name[0]+1] = 0;
  120.         addr.port.u.portTypeStr[addr.port.u.portTypeStr[0]+1] = 0;
  121.         printf(
  122.             "# accepted connection from %s[%s]", 
  123.             ((char *)addr.port.name)+1, 
  124.             ((char *)addr.port.u.portTypeStr)+1);
  125.         
  126.         switch (addr.location.locationKindSelector) {
  127.         case ppcNBPLocation:
  128.             addr.location.u.nbpEntity.objStr[addr.location.u.nbpEntity.objStr[0]+1] = 0;
  129.             addr.location.u.nbpEntity.typeStr[addr.location.u.nbpEntity.typeStr[0]+1] = 0;
  130.             addr.location.u.nbpEntity.zoneStr[addr.location.u.nbpEntity.zoneStr[0]+1] = 0;
  131.             printf(
  132.                 "@%s:%s:%s\n", 
  133.                 ((char *)addr.location.u.nbpEntity.objStr)+1, 
  134.                 ((char *)addr.location.u.nbpEntity.typeStr)+1, 
  135.                 ((char *)addr.location.u.nbpEntity.zoneStr)+1);
  136.             break;
  137.         case ppcNBPTypeLocation:
  138.             addr.location.u.nbpType[addr.location.u.nbpType[0]+1] = 0;
  139.             printf("@%s\n", ((char *)addr.location.u.nbpType)+1);
  140.             break;
  141.         default:
  142.             printf("\n");
  143.             break;
  144.         }
  145.     }
  146.     
  147.     Where();
  148. }
  149.     
  150. void Connect(char ch1, char ch2, const char * cmd)
  151. {
  152.     int                        len;
  153.     struct sockaddr_ppc    addr;
  154.  
  155.     if (sock == -1)    {
  156.         printf("# socket is not open\n");
  157.         Where();
  158.         
  159.         return;
  160.     }
  161.     
  162.     len = sizeof(struct sockaddr_ppc);
  163.         
  164.     if (choose(AF_PPC, 0, "Yeah ?", &Constr, 0, &addr, &len))    {
  165.         printf("# choose() returned error %s\n", Explain());
  166.         Where();
  167.             
  168.         return;
  169.     }
  170.     if (connect(sock, (struct sockaddr *) &addr, sizeof(struct sockaddr_ppc)))    {
  171.         printf("# connect() returned error %s\n", Explain());
  172.         Where();
  173.     }
  174. }    
  175.  
  176. main(int argc, char ** argv)
  177. {
  178.     GUSISetup(GUSIwithSIOUXSockets);
  179.     GUSISetup(GUSIwithPPCSockets);
  180.     
  181.     printf("GUSIPPCTest        MN 10Jun94\n\n");
  182.  
  183.     COMMAND('s', 's', Socket,  "",                 "Create a stream socket");
  184.     COMMAND('b', 'd', Bind,      "Name Type",     "Bind to address");
  185.     COMMAND('c', 'o', Connect, "",                 "Connect to address");
  186.     COMMAND('a', 'c', Accept,  "",                 "Accept a connection");
  187.     
  188.     AddSocketCommands();
  189.     
  190.     RunTest(argc, argv);
  191.     CleanupSockets();
  192. }